package com.mf.handler;

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import com.mf.entity.vo.MergePropVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

import java.util.List;

/**
 * @Author: lmf
 * @Create: 2024/6/25 17:05
 * Description: 表单合并策略
 */
@Slf4j
public class CustomMergeStrategy extends AbstractMergeStrategy {
    private final List<MergePropVo> mergePropVoList;

    public CustomMergeStrategy(List<MergePropVo> mergePropVoList) {
        this.mergePropVoList = mergePropVoList;
    }


    /**
     * 根据给定的单元格和表头信息，合并单元格。
     * 此方法用于计算合并单元格的起始和结束行索引，然后创建一个CellRangeAddress对象，并将其添加到工作表的合并区域列表中。
     *
     * @param sheet            工作表对象，表示需要进行合并操作的工作表。
     * @param cell             当前需要合并的单元格对象。
     * @param head             表头信息，用于计算合并单元格的起始位置。
     * @param relativeRowIndex 相对行索引，用于计算表头占用的行数。
     */
    @Override
    protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
        // 获取表头占用行数
        int headOccupyRowNUmber = cell.getRowIndex() - relativeRowIndex - 1;

        // 遍历合并属性列表，寻找与当前单元格匹配的合并属性
        for (MergePropVo mergePropVo : mergePropVoList) {
            // 判断当前单元格是否为合并区域的起始单元格
            if (cell.getRowIndex() == mergePropVo.getRowStartIndex() + headOccupyRowNUmber) {
                if (cell.getColumnIndex() == mergePropVo.getColumnIndex()) {
                    int mergeRowEndIndex =
                            cell.getRowIndex() + mergePropVo.getRowEndIndex() - mergePropVo.getRowStartIndex();
                    // 创建CellRangeAddress对象，表示合并区域
                    CellRangeAddress cellRangeAddress = new CellRangeAddress(
                            cell.getRowIndex(),
                            mergeRowEndIndex,
                            cell.getColumnIndex(),
                            cell.getColumnIndex()
                    );
                    // 将合并区域添加到工作表中
                    sheet.addMergedRegion(cellRangeAddress);
                }
            }
        }
    }


}
